原因
为什么一定要刷、有没有考虑过其他方案、是不是其他方案都解决不了。
利润报表里的大部分的数据是从 order_statistic[mongo]
表里提取出来的,而现在这个表是按照 orderedtime 下单日期
来统计的。如果想要增加其他两种统计方式的话,必须增加按照其他方式重新生成统计后的数据,并且把这些数据放到新的文档中。为了方便管理,把按照不同统计方法生成的文档放在不同的表中。
SQL或脚本
sql语句:
# 第一步,对于 order_statistics 表,更名为 order_statistics_orderedtime 表
use admin
db.runCommand({renameCollection:"xnn_core_product_0502.order_statistics_new",to:"xnn_core_product_0502.order_statistics_orderedtime"})
# 第二步,新建 order_statistic_cycletime 表,新建 order_statistic_receivedtime 表
use xnn_core_product_0502
db.order_statistics_cycletime.drop()
db.order_statistics_receivedtime.drop()
db.createCollection('order_statistics_cycletime')
db.createCollection('order_statistics_receivedtime')
# 第三步,使用 .py 脚本写入新增的两个表
项目代码改动
- 对于原有查询,由「查询 order_statistic 表」改为「查询 order_statistic_orderedtime 表」,逻辑不变
- 对于新加的「根据收货时间查询」和「根据周期查询」,按照下面的逻辑写新的查询代码
附:三种查询方式的基本逻辑
-
根据下单时间查询 在 order_statistic_orderedtime 表内查询
orderedtime
和station_id
符合条件的文档 -
根据运营周期查询 接口获得
time_config_id
,cycle_start_time
和cycle_end_time
在 order_statistic_cycletime 表内查询-
如果运营周期类型是「预售」:
query['time_config_id'] = time_config_id query['customer.receive_begin_time'] = {'$gte': receive_begin_time} query['customer.receive_end_time'] = {'$lte': receive_end_time}
(其中
receive_begin_time
和receive_end_time
是算出来的) -
如果运营周期类型是「默认」:
query['time_config_id'] = time_config_id query['date_time'] = {'$gte': date_time_start,'$lt': date_time_end}
(其中
date_time_start
和date_time_end
是算出来的)
-
-
根据收货时间查询
认为某个订单的收货日期是这个订单的
receive_begin_time
所在的日期。 # TODO: 多少没有query['customer.receive_begin_time'] = { '$gte': str(receive_start_date), '$lt': str(receive_end_date) }
生成 order_statistic_.* 表的逻辑
order_statistic_orderedtime:
statistics_map[(
station_id,
orderedtime,
salemenu_id
)] = stats
sta_co.insert(statistics_map.values())
order_statistic_cycletime:
statistics_map[(
station_id,
orderedtime,
salemenu_id,
time_config_id,
receive_begin_time,
receive_end_time,
)] = stats
sta_co.insert(statistics_map.values())
order_statistic_receivedtime:
statistics_map[(
station_id,
orderedtime,
salemenu_id
receive_begin_time,
)] = stats
sta_co.insert(statistics_map.values())
添加索引
order_new:
{
"status" : 1.0,
"customer.receive_begin_time" : 1.0,
"station_id" : 1.0
}
```
Review人
...
Review意见
...
关联业务
数据表关联业务有哪些、如果刷错了、会影响哪些业务。
station|数据中心|利润报表 里的两个报表。 刷错了的话影响的也只有这两个报表。
紧急处理方案
- 出现刷错的紧急恢复方案:无
- 是否是重要数据:否
- 是否需要刷之前先备份数据:否,刷错的话可以按照老脚本再重新生成一遍 order_statistic 表。
- 是否需要提供恢复脚本:否